/**
 * @file TrackerAddOn.h
 * @brief Tracker插件头文件
 * @details 定义了Tracker右键菜单插件的接口
 */

#ifndef TRACKER_ADDON_H
#define TRACKER_ADDON_H

#include <Entry.h>
#include <MenuItem.h>
#include <Message.h>
#include <Path.h>
#include <String.h>
#include <Roster.h>
#include <NodeInfo.h>
#include <Bitmap.h>
#include <Font.h>
#include <InterfaceDefs.h>

#include "../core/HZipEngine.h"

/**
 * @class HZipTrackerAddOn
 * @brief HZip的Tracker插件类
 * @details 实现了Tracker右键菜单的压缩/解压缩功能
 */
class HZipTrackerAddOn
{
public:
    /**
     * @brief 构造函数
     */
    HZipTrackerAddOn();

    /**
     * @brief 析构函数
     */
    ~HZipTrackerAddOn();

    /**
     * @brief 处理Tracker的Process方法
     * @param cwd 当前工作目录
     * @param refs 选中的文件引用数组
     * @param count 选中的文件数量
     */
    void Process(const char *cwd, const entry_ref *refs, int32 count);

    /**
     * @brief 生成右键菜单项
     * @param cwd 当前工作目录
     * @param refs 选中的文件引用数组
     * @param count 选中的文件数量
     * @param items 菜单项数组
     * @param messages 消息数组
     * @return 添加的菜单项数量
     */
    int32 GetMenuItems(const char *cwd, const entry_ref *refs, int32 count, BMenuItem **items, BMessage **messages);

private:
    /**
     * @brief 检查文件是否为压缩文件
     * @param path 文件路径
     * @return 是否为压缩文件
     */
    bool _IsArchiveFile(const char *path) const;

    /**
     * @brief 获取图标字体
     * @return 图标字体
     */
    BFont _GetIconFont() const;

    /**
     * @brief 创建带图标的菜单项
     * @param label 菜单项标签
     * @param message 菜单项消息
     * @param iconChar 图标字符
     * @return 创建的菜单项
     */
    BMenuItem *_CreateIconMenuItem(const char *label, BMessage *message, uint32 iconChar) const;

public:
    /**
     * @brief 执行压缩操作
     * @param refs 选中的文件引用数组
     * @param count 选中的文件数量
     * @param format 压缩格式
     */
    void _DoCompress(const entry_ref *refs, int32 count, const char *format);

    /**
     * @brief 执行解压缩操作
     * @param refs 选中的文件引用数组
     * @param count 选中的文件数量
     */
    void _DoExtract(const entry_ref *refs, int32 count);

    // 压缩/解压缩引擎
    HZipEngine fEngine;
};

// 消息常量
enum
{
    MSG_ADDON_COMPRESS_ZIP = 'adcz',    // 压缩为ZIP
    MSG_ADDON_COMPRESS_TAR = 'adct',    // 压缩为TAR
    MSG_ADDON_COMPRESS_TARGZ = 'adcg',  // 压缩为TAR.GZ
    MSG_ADDON_COMPRESS_TARBZ2 = 'adcb', // 压缩为TAR.BZ2
    MSG_ADDON_COMPRESS_TARZST = 'adcs', // 压缩为TAR.ZST
    MSG_ADDON_EXTRACT = 'adex'          // 解压缩
};

// 导出的C函数接口，供Tracker调用
extern "C"
{
    // 获取插件API版本
    int32 api_version(void);

    // 生成右键菜单项
    int32 add_on_init(const char *cwd, const entry_ref *refs, int32 count, BMenuItem **items, BMessage **messages);

    // 处理菜单项点击
    void process_refs(const char *cwd, const entry_ref *refs, int32 count, BMessage *message);
}

#endif // TRACKER_ADDON_H